package cn.h8k.hj212.version;

import cn.h8k.hj212.entity.Hj212Message;

import java.util.Map;

/**
 * 协议版本适配器接口
 * 用于处理不同版本HJ212协议之间的差异
 * 
 * @author HJ212 Team
 * @since 1.0
 */
public interface VersionAdapter {
    
    /**
     * 获取支持的协议版本
     * @return 协议版本
     */
    ProtocolVersion getSupportedVersion();
    
    /**
     * 检查协议数据是否符合当前版本格式
     * @param protocolData 协议数据
     * @return 是否符合格式
     */
    boolean isCompatible(String protocolData);
    
    /**
     * 将协议数据适配到标准格式
     * @param protocolData 原始协议数据
     * @return 标准格式的协议数据
     */
    String adaptToStandard(String protocolData);
    
    /**
     * 将标准格式适配到特定版本格式
     * @param standardData 标准格式数据
     * @return 特定版本格式的协议数据
     */
    String adaptFromStandard(String standardData);
    
    /**
     * 解析协议数据为消息实体
     * @param protocolData 协议数据
     * @return 消息实体
     */
    Hj212Message parseMessage(String protocolData);
    
    /**
     * 将消息实体转换为协议数据
     * @param message 消息实体
     * @return 协议数据
     */
    String formatMessage(Hj212Message message);
    
    /**
     * 获取版本特定的常量定义
     * @return 常量映射
     */
    Map<String, Object> getVersionConstants();
    
    /**
     * 验证协议数据的版本特定规则
     * @param protocolData 协议数据
     * @return 验证结果
     */
    ValidationResult validateProtocol(String protocolData);
    
    /**
     * 获取版本特定的字段映射
     * @return 字段映射
     */
    Map<String, String> getFieldMappings();
    
    /**
     * 转换字段名称（从旧版本到新版本）
     * @param oldFieldName 旧字段名
     * @return 新字段名
     */
    String mapFieldName(String oldFieldName);
    
    /**
     * 转换字段值（从旧版本到新版本）
     * @param fieldName 字段名
     * @param oldValue 旧值
     * @return 新值
     */
    Object mapFieldValue(String fieldName, Object oldValue);
    
    /**
     * 验证结果类
     */
    class ValidationResult {
        private final boolean valid;
        private final String message;
        private final String errorCode;
        private final ProtocolVersion detectedVersion;
        
        public ValidationResult(boolean valid, String message, String errorCode, ProtocolVersion detectedVersion) {
            this.valid = valid;
            this.message = message;
            this.errorCode = errorCode;
            this.detectedVersion = detectedVersion;
        }
        
        public static ValidationResult success(ProtocolVersion version) {
            return new ValidationResult(true, null, null, version);
        }
        
        public static ValidationResult failure(String message, String errorCode, ProtocolVersion version) {
            return new ValidationResult(false, message, errorCode, version);
        }
        
        public boolean isValid() {
            return valid;
        }
        
        public String getMessage() {
            return message;
        }
        
        public String getErrorCode() {
            return errorCode;
        }
        
        public ProtocolVersion getDetectedVersion() {
            return detectedVersion;
        }
    }
}
